CSSã¢ãŒã·ã§ã³ãã¹ã»ã°ã¡ã³ããå¶åŸ¡ããŠãé«åºŠãªWebã¢ãã¡ãŒã·ã§ã³ãå®çŸããŸãããããã®ã¬ã€ãã§ã¯ãoffset-pathãoffset-distanceãããã³ããŒãã¬ãŒã ã®ãã¯ããã¯ã«ã€ããŠèª¬æããŸãã
CSSã¢ãŒã·ã§ã³ãã¹ã»ã°ã¡ã³ãã®ãã¹ã¿ãŒïŒãã¹éšåã¢ãã¡ãŒã·ã§ã³ã®åŸ¹åºè§£èª¬
Webãã¶ã€ã³ãšéçºãé²åãç¶ããäžã§ãã¢ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ãšã£ãŠéèŠãªèšèªã«ãªããŸãããã¢ãŒã·ã§ã³ã¯æ³šæãåŒãããã£ãŒãããã¯ãæäŸããéçãªã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯äžå¯èœãªæ¹æ³ã§ã¹ããŒãªãŒãäŒããŸããé·å¹Žãè€éãªã¢ãŒã·ã§ã³ã«ã¯ãå€§èŠæš¡ãªJavaScriptã©ã€ãã©ãªãå°çšã®ã¢ãã¡ãŒã·ã§ã³ããŒã«ãå¿ èŠã§ãããããããCSSã¢ãŒã·ã§ã³ãã¹ã¢ãžã¥ãŒã«ã¯ã匷åãªãã€ãã£ããœãªã¥ãŒã·ã§ã³ãšããŠç»å Žããéçºè ã¯ã¹ã¿ã€ã«ã·ãŒãã§çŽæ¥ã«ã¹ã¿ã å®çŸ©ããããã¹ã«æ²¿ã£ãŠèŠçŽ ãã¢ãã¡ãŒã·ã§ã³åã§ããŸããããã¯ãããã©ãŒãã³ã¹ãé«ã宣èšçãªã¢ãã¡ãŒã·ã§ã³ãäœæããããã®ã²ãŒã ãã§ã³ãžã£ãŒã§ãã
ã»ãšãã©ã®ãã¥ãŒããªã¢ã«ã§ã¯ããã¹ã®å šäœã«æ²¿ã£ãŠãæåããæåŸãŸã§èŠçŽ ãã¢ãã¡ãŒã·ã§ã³åããããšã§ã¢ãŒã·ã§ã³ãã¹ã玹ä»ããŠããŸããããããããªãã®åµé çãªããžã§ã³ãããå€ãã®ãã¥ã¢ã³ã¹ãèŠæ±ããå Žåã¯ã©ããªãã§ããããïŒãªããžã§ã¯ããè€éãªåœ¢ç¶ã®1ã€ã®ã«ãŒãã«æ²¿ã£ãŠç§»åãããäžæåæ¢ããŠããå¥ã®ã»ã°ã¡ã³ãã«æ²¿ã£ãŠç¶è¡ããå¿ èŠãããå Žåã¯ã©ããªãã§ããããïŒããã«çã®ç¿åŸããããŸãããã¹ã ãã§ãªããæ ã®ç¹å®ã®éšåãå¶åŸ¡ããããšã§ãã
ãã®å æ¬çãªã¬ã€ãã¯ãåºæ¬ãè¶ ãããäžçäžã®éçºè ãšãã¶ã€ããŒåãã§ããCSSã¢ãŒã·ã§ã³ãã¹ã®ç¹å®ã®ã»ã°ã¡ã³ãã«æ²¿ã£ãŠèŠçŽ ãã¢ãã¡ãŒã·ã§ã³åããããã«å¿ èŠãªãã¯ããã¯ãåæããJavaScriptã1è¡ãèšè¿°ããã«ãæ¯ãä»ããã衚çŸåè±ããªWebã¢ãã¡ãŒã·ã§ã³ã®æ°ããã¬ãã«ãéããŸãã
åºç€ïŒCSSã¢ãŒã·ã§ã³ãã¹ã®ç°¡åãªãã¢ãŒ
ã»ã°ã¡ã³ããå¶åŸ¡ããåã«ãã¢ãŒã·ã§ã³ãã¹ãæ©èœãããã³ã¢ããããã£ããã£ãããšçè§£ããŠããå¿ èŠããããŸãããã§ã«æ £ããŠããå Žåã¯ãç°¡åãªåŸ©ç¿ãšèããŠãã ãããåããŠã®å Žåã¯ããããäžå¯æ¬ ãªåºçºç¹ã§ãã
ã³ã¢ããããã£
CSSã¢ãŒã·ã§ã³ãã¹ã¬ãã«1ã®ä»æ§ã§ã¯ãèŠçŽ ã®åããå®çŸ©ããã³å¶åŸ¡ããããã«é£æºããŠæ©èœããããããã£ã®ã»ãããå®çŸ©ããŠããŸããæãéèŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
offset-pathïŒããã¯ã¢ãžã¥ãŒã«ã®äžå¿ã§ããèŠçŽ ããã©ã幟äœåŠçãã¹ãå®çŸ©ããŸãããããå®çŸ©ããæãäžè¬çã§åŒ·åãªæ¹æ³ã¯ãSVGãã¹ããŒã¿æååãåãå ¥ããpath()颿°ã䜿çšããããšã§ããã€ãŸãããã¯ã¿ãŒã°ã©ãã£ãã¯ã¹ãšãã£ã¿ãŒïŒIllustratorãInkscapeãFigmaãªã©ïŒã§è€éãªãã¹ãèšèšããSVGãã¹ããŒã¿ãã³ããŒããŠCSSã«çŽæ¥è²Œãä»ããããšãã§ããŸããoffset-distanceïŒãããã¢ãã¡ãŒã·ã§ã³ã®ããã°ã¬ã¹ããŒãšèããŠãã ãããoffset-pathã«æ²¿ã£ãèŠçŽ ã®äœçœ®ãæå®ããŸãã0%ã®å€ã¯ããã¹ã®å é ã«èŠçŽ ãé 眮ãã100%ã¯æåŸã«é 眮ããŸãããã®ããããã£ãã¢ãã¡ãŒã·ã§ã³åãããšãã¢ãŒã·ã§ã³ãäœæãããŸããoffset-rotateïŒãã®ããããã£ã¯ãèŠçŽ ããã¹ã«æ²¿ã£ãŠç§»åãããšãã®èŠçŽ ã®åããå¶åŸ¡ããŸããããã©ã«ãã§ã¯ãèŠçŽ ã¯å転ããŸãããautoã«èšå®ãããšãèŠçŽ ã®ããŒã¹ã©ã€ã³ããã¹ã®æ¹åã«èªåçã«åããéè·¯äžã®è»ã空ã®é£è¡æ©ãªã©ã«æé©ã§ããauto 90degã®ãããªè§åºŠã远å ããŠãèŠçŽ ããã¹ã®æ¹åã«åçŽã«ããããšãã§ããŸããoffset-anchorïŒããã¯ãèŠçŽ èªäœã®ã©ã®ãã€ã³ãããã¹ã«åºå®ããããå®çŸ©ããŸããããã©ã«ãã¯autoã§ã50% 50%ãŸãã¯èŠçŽ ã®äžå¿ãšåçã§ããä»ã®åº§æšïŒããšãã°ãå·Šäžé ã®0% 0%ïŒãæå®ããŠãèŠçŽ ãè»éã«ã©ã®ããã«ãåºå®ãããããã倿Žã§ããŸãã
ç°¡åãªããã«ãã¹ãã¢ãã¡ãŒã·ã§ã³ã®äŸ
ãããã®ããããã£ãåäœããå€å žçãªäŸãèŠãŠã¿ãŸããããåçŽãªæ²ç·ãã¹ã®æåããæåŸãŸã§ãªããžã§ã¯ããã¢ãã¡ãŒã·ã§ã³åããŸããããã«ãããã»ã°ã¡ã³ãå¶åŸ¡ã«é²ãåã«ãããŒã¹ã©ã€ã³ã確ç«ãããŸãã
<!-- HTML Structure -->
<div class="scene">
<div class="dot"></div>
</div>
<style>
.scene {
width: 300px;
height: 200px;
border: 1px solid #ccc;
margin: 2em auto;
}
.dot {
width: 20px;
height: 20px;
background-color: dodgerblue;
border-radius: 50%;
offset-path: path('M 20,100 C 50,20 250,20 280,100');
animation: move-along-full-path 4s infinite linear;
}
@keyframes move-along-full-path {
from {
offset-distance: 0%;
}
to {
offset-distance: 100%;
}
}
</style>
ãã®äŸã§ã¯ã.dotèŠçŽ ã«æ²ç·ç¶ã®offset-pathãå²ãåœãŠãããŠããŸããæ¬¡ã«ãmove-along-full-pathã¢ãã¡ãŒã·ã§ã³ã¯ãoffset-distanceã4ç§ãããŠ0%ãã100%ã«æäœããŸããããã¯æšæºçãªåºæ¬çãªãŠãŒã¹ã±ãŒã¹ã§ããããããç§ãã¡ã®ç®æšã¯ããã®åçŽãªæåããæåŸã®ãã©ãã€ã ããè§£æŸãããããšã§ãã
ã³ã¢ã®èª²é¡ïŒç¹å®ã®ãã¹ã»ã°ã¡ã³ãã®ã¢ãã¡ãŒã·ã§ã³å
çŸå®ã®äžçã¯ãåçŽãªAããZãžã®éã®ãã§ããããšã¯ãã£ãã«ãããŸãããéœåžã®å ¬å ±äº€éæ©é¢ã®Webãµã€ãã«ããå°äžéã®å°å³ãæ³åããŠãã ãããéœåžãããã¯ãŒã¯å šäœã§é»è»ãã¢ãã¡ãŒã·ã§ã³åããã®ã§ã¯ãªãã2ã€ã®ç¹å®ã®é§ éã®ç§»åã衚瀺ããå¿ èŠããããŸãããŸãã¯ãããã€ã¹ã®ç»é¢ããã«ã¡ã©ã¬ã³ãºã«ãŠãŒã¶ãŒã®æ³šæãåŒãã€ã³ã¿ã©ã¯ãã£ããªè£œåãã¢ãŒãæ€èšããŠãã ãããããã¯ãããã€ã¹ã®èŒªéãæãäºåã«å®çŸ©ããããã¹ã«æ²¿ã£ãŠ20ïŒ ãã35ïŒ ã«ç§»åããããšã衚ããŠããå¯èœæ§ããããŸãã
ãããã®ã·ããªãªã¯ãç²åºŠã®çްããå¶åŸ¡ã®å¿ èŠæ§ã匷調ããŠããŸããã¢ãã¡ãŒã·ã§ã³ã«æ¬¡ã®ããšãæç€ºããæ¹æ³ãå¿ èŠã§ãã
- ãã¹ã«æ²¿ã£ãä»»æã®ãã€ã³ãããéå§ããŸãïŒäŸïŒ25ïŒ ïŒã
- å¥ã®ä»»æã®ãã€ã³ãã§çµäºããŸãïŒäŸïŒ80ïŒ ïŒã
- ã¢ãã¡ãŒã·ã§ã³ã®å šæéã«ããã£ãŠãã®éšåçãªç§»åãå®è¡ããŸãã
ããã§ã¯ãCSSããŒãã¬ãŒã ã®ããæ·±ãçè§£ã圹ç«ã€ã ãã§ãªããäžå¯æ¬ ã«ãªããŸããéæ³ã¯ãæ°ããæªçºèŠã®CSSããããã£ã«ããã®ã§ã¯ãªãããã§ã«ç¥ã£ãŠãã@keyframesã«ãŒã«å
ã®offset-distanceããããã£ã®æŠç¥çãªæäœã«ãããŸãã
解決çïŒããŒãã¬ãŒã ã«ããç²åºŠã®çްããå¶åŸ¡
ãã¹éšåã¢ãã¡ãŒã·ã§ã³ã®éµã¯ã@keyframesãããã¯å
ã®fromããã³toïŒãŸãã¯0%ããã³100%ïŒããŒã«ãŒããå¿
ãããã¢ãŒã·ã§ã³ãã¹ã®éå§ãšçµäºãæå³ããããã§ã¯ãªãã¢ãã¡ãŒã·ã§ã³èªäœã®ã¿ã€ã ã©ã€ã³ãåç
§ããããšã«æ°ã¥ãããšã§ãããããã®ããŒã«ãŒã«ä»»æã®offset-distanceå€ãå²ãåœãŠãããšãã§ããŸãã
ãã¯ããã¯1ïŒåºæ¬çãªã»ã°ã¡ã³ãã®ã¢ãã¡ãŒã·ã§ã³å
åã®äŸãé©å¿ãããŸãããããããããã¹å šäœã«æ²¿ã£ãŠç§»åããã代ããã«ãäžå€®ã®ã»ã¯ã·ã§ã³ãå ·äœçã«ã¯25ïŒ ããŒã¯ãã75ïŒ ããŒã¯ãŸã§ã®ã¿ç§»åãããŸãã
<!-- HTML is the same -->
<div class="scene">
<div class="dot-segment"></div>
</div>
<style>
/* .scene styles are the same */
.scene {
width: 300px;
height: 200px;
border: 1px solid #ccc;
margin: 2em auto;
}
.dot-segment {
width: 20px;
height: 20px;
background-color: crimson;
border-radius: 50%;
/* The same path as before */
offset-path: path('M 20,100 C 50,20 250,20 280,100');
/* Set initial position if needed */
offset-distance: 25%;
/* Animate with new keyframes */
animation: move-along-segment 4s forwards;
}
@keyframes move-along-segment {
from {
offset-distance: 25%;
}
to {
offset-distance: 75%;
}
}
</style>
éèŠãªå€æŽç¹ãåæããŸãããã
- ããŒãã¬ãŒã ïŒ
0%ãã100%ã«ã¢ãã¡ãŒã·ã§ã³åãã代ããã«ãmove-along-segmentããŒãã¬ãŒã ã¯ãç§»åã®éå§ç¹ãšçµäºç¹ãããããoffset-distance: 25%ããã³offset-distance: 75%ãšããŠæç€ºçã«å®çŸ©ããŸãã animation-fill-mode: forwards;ïŒããã¯éåžžã«éèŠã§ãããã®ããããã£ã¯ãã¢ãã¡ãŒã·ã§ã³ãå®äºãããšãèŠçŽ ãæåŸã®ããŒãã¬ãŒã ïŒtoãŸãã¯100%ïŒã®ã¹ã¿ã€ã«ãä¿æããå¿ èŠãããããšããã©ãŠã¶ã«æç€ºããŸããforwardsããªãå Žåã4ç§ã®ã¢ãã¡ãŒã·ã§ã³ãçµäºããåŸããããã¯ã¢ãã¡ãŒã·ã§ã³ãé©çšãããåã®åæç¶æ ã«æ»ããŸããããã䜿çšããããšã§ããããã25ïŒ ãã75ïŒ ã«ã¢ãã¡ãŒã·ã§ã³åããã75ïŒ ããŒã¯ã«ãšã©ãŸãããšãä¿èšŒããŸãã- åæç¶æ
ïŒãªãã·ã§ã³ã§ããè¯ãç¿æ
£ïŒïŒèŠçŽ ã«çŽæ¥
offset-distance: 25%;ãèšå®ãããšãã¢ãã¡ãŒã·ã§ã³ãéå§ãããåã§ããèŠçŽ ãæ£ããäœçœ®ããéå§ãããããšãä¿èšŒãããŸãã
ãã®ç°¡åãªå€æŽã«ãããåºæ¬çãªãã¯ããã¯ãå©çšã§ããããã«ãªããŸãããã¢ãã¡ãŒã·ã§ã³ã®åèšæéã§ãã4ç§ã¯ããã¹ã®é·ãã®50ïŒ ïŒ25ïŒ ãã75ïŒ ïŒã®ç§»åã«é©çšãããããã«ãªããã¢ãŒã·ã§ã³ã®ç¯å²ãšéåºŠãæ£ç¢ºã«å¶åŸ¡ã§ããŸãã
ãã¯ããã¯2ïŒãã«ãã¹ããŒãžãžã£ãŒããŒã®æ¯ãä»ã
ããé«åºŠã§å®çšçãªã·ããªãªïŒäžæåæ¢ã®ãããã«ãã¹ããŒãžã¢ãã¡ãŒã·ã§ã³ãäœæããŸããããã¯ãã¬ã€ãä»ããã¢ãŒãã¹ããŒãªãŒããªã³ã°ããŸãã¯æ®µéçãªæç€ºã«æé©ã§ããæ¬¡ã®æ¯ãä»ãã§ã¢ãã¡ãŒã·ã§ã³ãäœæããŸãããã
- ã¹ããŒãž1ïŒéå§ïŒ0ïŒ ïŒãã40ïŒ ããŒã¯ã«ç§»åããŸãã
- ã¹ããŒãž2ïŒ40ïŒ ããŒã¯ã§å°ãäžæåæ¢ããŸãã
- ã¹ããŒãž3ïŒ40ïŒ ããŒã¯ããæåŸã®90ïŒ ããŒã¯ã«ç§»åãç¶ããŸãã
ãããå®çŸããã«ã¯ãããŒãã¬ãŒã ã®ããŒã»ã³ããŒãžã䜿çšããŠãã¹ããŒãªãŒãã¢ãã¡ãŒã·ã§ã³ã®ã¿ã€ã ã©ã€ã³ã«ãããã³ã°ããå¿ èŠããããŸããã¢ãã¡ãŒã·ã§ã³ã®åèšæéã10ç§ã ãšããŸããããæ¬¡ã®ããã«æéãå²ãåœãŠãããšãã§ããŸãã
- æåã®åãïŒ4ç§ïŒïŒã¢ãã¡ãŒã·ã§ã³ã®ã¿ã€ã ã©ã€ã³ã®æåã®40ïŒ ã䜿çšããŸãïŒ0ïŒ ãã40ïŒ ã®ããŒãã¬ãŒã ïŒã
- äžæåæ¢ïŒ2ç§ïŒïŒã¿ã€ã ã©ã€ã³ã®æ¬¡ã®20ïŒ ã䜿çšããŸãïŒ40ïŒ ãã60ïŒ ã®ããŒãã¬ãŒã ïŒã
- 2çªç®ã®åãïŒ4ç§ïŒïŒã¿ã€ã ã©ã€ã³ã®æåŸã®40ïŒ ã䜿çšããŸãïŒ60ïŒ ãã100ïŒ ã®ããŒãã¬ãŒã ïŒã
次ã«ãã³ãŒãã«ã©ã®ããã«å€æããããã瀺ããŸãã
@keyframes multi-stage-journey {
/* Stage 1: Move from 0% to 40% of the path */
/* This happens during the first 40% of the animation's duration */
0% {
offset-distance: 0%;
}
40% {
offset-distance: 40%;
}
/* Stage 2: Pause */
/* Hold the position at 40% of the path */
/* This happens between 40% and 60% of the animation's duration */
60% {
offset-distance: 40%;
}
/* Stage 3: Move from 40% to 90% of the path */
/* This happens during the final 40% of the animation's duration */
100% {
offset-distance: 90%;
}
}
.dot-multi-stage {
/* ... other styles ... */
animation: multi-stage-journey 10s forwards;
}
äžæåæ¢ã®éµã¯ãåãoffset-distanceå€ãæã€2ã€ã®é£æ¥ããããŒãã¬ãŒã ããŒã«ãŒïŒ40%ãš60%ïŒãæã€ããšã§ããã¢ãã¡ãŒã·ã§ã³ã®ã¿ã€ã ã©ã€ã³ã®40ïŒ
ãã60ïŒ
ã®éã®æéã`offset-distance`ã¯å€åãããåãã«å®å
šã«äžæåæ¢ãäœæããŸãããã®ãã¯ããã¯ã䜿çšãããšãã¢ãã¡ãŒã·ã§ã³ã®ããŒã¹ãšãªãºã ããã£ã¬ã¯ã¿ãŒã¬ãã«ã§å¶åŸ¡ã§ããŸãã
ããã®ã¯ãŒã¯ãããŒåãã®é«åºŠãªãã¯ããã¯
åºæ¬ãç¿åŸããããšã¯çŽ æŽãããããšã§ãããããã®éçºã«ã¯ãä¿å®å¯èœã§åçã§ã¢ã¯ã»ã¹å¯èœãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ããé«åºŠãªãã¯ããã¯ãããã€ãèŠãŠã¿ãŸãããã
CSSã«ã¹ã¿ã ããããã£ïŒå€æ°ïŒã䜿çšããåçã»ã°ã¡ã³ã
ããŒãã¬ãŒã ã«25%ã75%ãªã©ã®å€ãããŒãã³ãŒãã£ã³ã°ããããšã¯æ©èœããŸãããæè»æ§ãããŸããããŸãããCSSã«ã¹ã¿ã ããããã£ã䜿çšãããšãã¢ãã¡ãŒã·ã§ã³ã»ã°ã¡ã³ããåçã«å®çŸ©ã§ãããããã³ãŒãã®åå©çšæ§ãåäžããç¹ã«JavaScriptã§ã®æŽæ°ã容æã«ãªããŸãã
.element-dynamic {
/* Define the segment endpoints as variables */
--segment-start: 15%;
--segment-end: 85%;
offset-path: path('...');
animation: move-dynamic-segment 5s forwards;
}
@keyframes move-dynamic-segment {
from {
offset-distance: var(--segment-start);
}
to {
offset-distance: var(--segment-end);
}
}
ãã®ã¢ãããŒãã¯éåžžã«åŒ·åã§ããããšãã°ãåãã¢ãã¡ãŒã·ã§ã³ã䜿çšããŠããããéå§å€æ°ãšçµäºå€æ°ãç°ãªãè€æ°ã®èŠçŽ ãæã€ããšãã§ããŸãããŸãã¯ãJavaScriptã䜿çšããŠããããäžã®æ
ã®ããŸããŸãªéšåã衚瀺ããããã«ç°ãªããã¿ã³ãã¯ãªãã¯ãããªã©ããŠãŒã¶ãŒã®æäœã«å¿ããŠ--segment-startãš--segment-endãæŽæ°ã§ããŸãã
animation-timing-functionã䜿çšããã»ã°ã¡ã³ãããšã®ã€ãŒãžã³ã°
ã¢ãŒã·ã§ã³ã¯äœçœ®ã ãã§ã¯ãããŸãããããã¯ãã£ã©ã¯ã¿ãŒã«ã€ããŠã§ããã€ãŒãžã³ã°ïŒæéã®çµéã«äŒŽããã©ã¡ãŒã¿ã®å€åçïŒã¯ãã¢ãã¡ãŒã·ã§ã³ã«åæ§ãäžããŸããäžè¬çãªèª€è§£ã¯ãanimation-timing-functionããããã£ãã¢ãã¡ãŒã·ã§ã³å
šäœã«ã®ã¿é©çšããããšããããšã§ãããã ããããŒãã¬ãŒã å
ã§å®£èšããŠããã®ããŒãã¬ãŒã ã«è³ããŸã§ã®ãã©ã³ãžã·ã§ã³ã«åœ±é¿ãäžããããšãã§ããŸãã
ãã«ãã¹ããŒãžã®æ ãæŽç·ŽããŸããããæåã®åããå éãïŒã€ãŒãºã€ã³ïŒãäžæåæ¢ãéçã«ãã2çªç®ã®åããç·©ããã«åæ¢ããããã«æžéããããïŒã€ãŒãºã¢ãŠãïŒã
@keyframes multi-stage-eased-journey {
0% {
offset-distance: 0%;
animation-timing-function: ease-in;
}
40% {
offset-distance: 40%;
/* This timing function applies to the pause */
animation-timing-function: linear;
}
60% {
offset-distance: 40%;
/* This timing function applies to the next movement */
animation-timing-function: ease-out;
}
100% {
offset-distance: 90%;
}
}
0%ã40%ãããã³60%ããŒãã¬ãŒã ã§ã¿ã€ãã³ã°é¢æ°ãæå®ããããšã«ãããã¢ãã¡ãŒã·ã§ã³ã®ããããã®ãã§ãŒãºã®ã€ãŒãžã³ã°ãæç€ºããŸãã0ã40ïŒ
ã®ç§»åã40ã60ïŒ
ã®äžæåæ¢ã60ã100ïŒ
ã®ç§»åããã®ã¬ãã«ã®å¶åŸ¡ã«ãããæŽç·Žãããèªç¶ãªæãã®ã¢ãŒã·ã§ã³ãäœæã§ããŸãã
ã¢ã¯ã»ã·ããªãã£åªå
ïŒprefers-reduced-motion
ã°ããŒãã«ãªãŒãã£ãšã³ã¹ãæã€ãããšããŠãå
æ¬çãªãšã¯ã¹ããªãšã³ã¹ãæ§ç¯ãã責任ããããŸããäžéšã®ãŠãŒã¶ãŒãç¹ã«ååºé害ã®ãããŠãŒã¶ãŒã®å Žåãå€§èŠæš¡ãªã¢ãã¡ãŒã·ã§ã³ã¯ããŸããåãæ°ããã®ä»ã®æ·±å»ãªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸããCSSã¯ãprefers-reduced-motionã¡ãã£ã¢ã¯ãšãªã䜿çšããŠãŠãŒã¶ãŒã®å¥œã¿ãå°éããç°¡åã§å¹æçãªæ¹æ³ãæäŸããŸãã
åžžã«ãã¢ãŒã·ã§ã³ã®è»œæžãèŠæ±ãããŠãŒã¶ãŒã«ä»£æ¿ææ®µãæäŸããããã«ã¢ãŒã·ã§ã³ãã¹ã¢ãã¡ãŒã·ã§ã³ãã©ããããŸãã
/* Apply the animation by default */
.animated-element {
animation: my-motion-path-animation 5s forwards;
}
/* Override it for users who prefer reduced motion */
@media (prefers-reduced-motion: reduce) {
.animated-element {
animation: none;
/* Optionally, you could replace it with a simple, non-distracting fade-in */
/* opacity: 0; */
/* animation: fade-in 1s forwards; */
}
}
ãã®å°ããªè¿œå ã¯ãèŠèŽè ã®ããªãã®éšåã«ãšã£ãŠå€§ããªéãããããããŸããããã¯ãææ°ã®è²¬ä»»ããWebéçºã®äžå¯æ¬ ãªéšåã§ãã
å®çšçãªã¢ããªã±ãŒã·ã§ã³ãšã°ããŒãã«ãŠãŒã¹ã±ãŒã¹
çè«ã¯äŸ¡å€ããããŸããããããã®ãã¯ããã¯ãåœéçã«çè§£ãããŠããå®çšçãªã·ããªãªã«çµã³ä»ããŸãããã
eã³ããŒã¹ïŒè£œåæ©èœã®ãã€ã©ã€ã
æ°ããã°ããŒãã«ã¹ããŒããã©ã³ã®è£œåããŒãžãæ³åããŠãã ãããéçãªç®æ¡æžãã®ä»£ããã«ãããã€ã¹ã®ã·ã«ãšããããã¬ãŒã¹ããoffset-pathãå®çŸ©ã§ããŸããæ¬¡ã«ãã¢ãã¡ãŒã·ã§ã³åããããããã¹ãããããç»é¢ã®ç«¯ïŒäŸïŒ10ïŒ
ã30ïŒ
ïŒããç§»åããæ°ããã«ã¡ã©ã·ã¹ãã ã§äžæåæ¢ãïŒ30ïŒ
ã§ä¿æïŒãã«ãŒãã«æ²¿ã£ãŠé«éå
é»ããŒãããã€ã©ã€ããç¶ããŸãïŒ40ïŒ
ã60ïŒ
ïŒãããã«ããããã€ãããã¯ã§é
åçã§æçãªè£œåãã¢ãŒãäœæãããŸãã
茞éãšããžã¹ãã£ã¯ã¹ïŒæ ã®èŠèŠå
åœéçãªééäŒç€Ÿãèªç©ºäŒç€ŸããŸãã¯æ è¡ããã°ã«ãšã£ãŠãã«ãŒãã®èŠèŠåã¯éèŠã§ããé£è¡æ©ãŸãã¯è¹ã®ã¢ã€ã³ã³ãäžçã®å°å³ã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³åã§ããŸããã»ã°ã¡ã³ãã¢ãã¡ãŒã·ã§ã³ã䜿çšãããšãæ±äº¬ããã·ã³ã¬ããŒã«ãžã®ãã©ã€ãïŒã»ã°ã¡ã³ã1ïŒã衚瀺ããã¢ãã¡ãŒã·ã§ã³ãäžæåæ¢ããŠä¹ãç¶ãã衚瀺ããã·ãããŒãžã®æ¥ç¶ãã©ã€ãïŒã»ã°ã¡ã³ã2ïŒãã¢ãã¡ãŒã·ã§ã³åã§ããŸããããã«ãããèšèªã®å£ãè¶ ããæç¢ºãªèŠèŠçãªã¹ããŒãªãŒããªã³ã°ãæäŸãããŸãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ãã£ãŒãããã¯ïŒãŠãŒã¶ãŒã®èªå°
ãŠãŒã¶ãŒãã¢ã¯ã·ã§ã³ãå®äºãããšãæç¢ºãªãã£ãŒãããã¯ãäžå¯æ¬ ã§ãããŠãŒã¶ãŒãWebã¢ããªã±ãŒã·ã§ã³ã§ãä¿åããã¿ã³ãã¯ãªãã¯ãããšããŸããå°ããªãã§ãã¯ããŒã¯ã¢ã€ã³ã³ãããã¿ã³ããã¹ããŒã¿ã¹ã¡ãã»ãŒãžé åïŒäŸïŒãããã¥ã¡ã³ããä¿åãããŸãããïŒãŸã§ã埮åŠãªååŒ§ã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³åãããå¯èœæ§ããããŸãããã®ã»ã°ã¡ã³ãã¢ãã¡ãŒã·ã§ã³ã¯ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ãã¢ããªã±ãŒã·ã§ã³ã®åå¿ã«ãšã¬ã¬ã³ãã«æ¥ç¶ãããŠãŒã¶ããªãã£ãåäžãããããæŽç·ŽããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœæããŸãã
ãã©ãŠã¶ã®äºææ§ãšæåŸã®èã
CSSã¢ãŒã·ã§ã³ãã¹ã¯ææ°ã®Webæšæºã§ãããã®èšäºã®å·çæç¹ã§ã¯ãChromeãFirefoxãSafariãEdgeãªã©ãäž»èŠãªãšããŒã°ãªãŒã³ãã©ãŠã¶ãã¹ãŠã§åªãããµããŒããæäŸãããŠããŸãããã ããã°ããŒãã«éçºè ã¯åžžã«CanIUse.comã®ãããªãªãœãŒã¹ãåç §ããŠãææ°ã®äºææ§æ å ±ãååŸããããšããå§ãããŸããç¹ã«ãç¹å®ã®ãªãŒãžã§ã³ã§å€ããã©ãŠã¶ããŒãžã§ã³ããµããŒãããå¿ èŠãããå Žåã¯ã
ãã¹ã®äžéšã«æ²¿ã£ãŠã¢ãã¡ãŒã·ã§ã³ãå¶åŸ¡ããæ©èœã«ãããCSSã¢ãŒã·ã§ã³ãã¹ã¢ãžã¥ãŒã«ã¯ç®æ°ãããããããã®ããã³ããšã³ãéçºè ããã³ã¢ãŒã·ã§ã³ãã¶ã€ããŒã«ãšã£ãŠäžå¯æ¬ ãªããŒã«ã«ãªããŸããå€éšã©ã€ãã©ãªã®ãªãŒããŒããããªãã«ãããã©ãŒãã³ã¹ãé«ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ããããè€éã§æ¯ãä»ããããæå³ã®ããã¢ãã¡ãŒã·ã§ã³ãäœæã§ããŸãã
çµè«
CSSã¢ãŒã·ã§ã³ãã¹ã®åºæ¬ãããã»ã°ã¡ã³ãå¶åŸ¡ã®ãã¥ã¢ã³ã¹ã®ããã¢ãŒããŸã§ãæ
ããŠããŸãããã³ã¢ã®ã¬ãã¹ã³ã¯ãCSS @keyframeså
ã§offset-distanceãæŠç¥çã«æäœããããšã§ãèŠçŽ ã®ç§»åãæ£ç¢ºã«å¶åŸ¡ã§ãããšããããšã§ããåçŽãªæåããæåŸã®ããªããã«éå®ãããªããªããŸããã
åºæ¬çãªã»ã°ã¡ã³ãã¢ãã¡ãŒã·ã§ã³ãç¿åŸããäžæåæ¢ã®ãããã«ãã¹ããŒãžã®æ
ãæ¯ãä»ããCSSã«ã¹ã¿ã ããããã£ãã»ã°ã¡ã³ãããšã®ã€ãŒãžã³ã°ãªã©ã®é«åºŠãªãã¯ããã¯ã掻çšããããšã§ããããã€ãããã¯ã§è¡šçŸåè±ãã§ä¿å®å¯èœãªã¢ãã¡ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããŸããprefers-reduced-motionã§åžžã«ã¢ã¯ã»ã·ããªãã£ãæåªå
ã«ããããšã§ãçŸããäœåããã¹ãŠã®ãŠãŒã¶ãŒã«ãšã£ãŠå
æ¬çã§æ¬æãæããã®ã«ãªãããã«ããŸãã
Webã¯ã¢ãŒã·ã§ã³ã®ãã£ã³ãã¹ã§ããããã§ãããçšéãåºã匷åãªãã©ã·ãæã«å ¥ããããšãã§ããŸããå®éšããçŽ æŽããããã®ãæ§ç¯ããCSSã§å¯èœãªããšã®å¢çãæŒãåºãç¶ããŠãã ããã